/*
	Copyright (C) 2013 Pontificia Universidad Catolica del Peru
	contact: http://avatar.inf.pucp.edu.pe/realidad-aumentada/
	address contact: Av. Universitaria 1801, San Miguel, Lima-Peru.
	
	This file is part of UbicAR PUCP.

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with This program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*
	Author: Pedro Carrión Castagnola
	Pontificia Universidad Catolica del Peru
	Direccion de Informatica Academica
	
	Modified by: Alvaro Roger Agüero Sánchez, Rodolfo Javier Galvez Meza
	Pontificia Universidad Catolica del Peru
	Departamento de Ingeniería
*/

package org.grupoavatar.guiaubicua;

import java.util.Collections;
import java.util.List;
import java.util.Vector;

import org.grupoavatar.guiaubicua.entidades.ARMarker;
import org.grupoavatar.guiaubicua.entidades.ListaPOIAdapter;
import org.grupoavatar.guiaubicua.entidades.ListaPOIRow;
import org.grupoavatar.guiaubicua.entidades.MarkerComparator;
import org.grupoavatar.guiaubicua.mix.DataView;
import org.grupoavatar.guiaubicua.mix.Marker;
import org.grupoavatar.guiaubicua.mix.data.DataSource.DATASOURCE;
import org.grupoavatar.guiaubicua.punto.MasterActivity;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.SearchView;

import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;

public class VBusqueda extends SherlockActivity  {
	private ListView listB;
	private List<Marker> markerList;
	private Vector<Integer> selectedItemIndex;
	private String textoBusqueda;
	private int ordenamiento = MarkerComparator.ORDENAMIENTO_RELEVANCIA;
	private boolean ordenar_eventos = true;
	public static boolean hayBusqueda = false;
	public static boolean primeraConsulta = true;
	public static boolean mostrarResultado = false;//texto de resultado de busqueda
	private static boolean mostrar_pois;
	
	String[] actions = new String[] {
			"Buscar por categoría",
			"Buscar por servicios",
			"Ver resultado en RA",
			"Ver resultado en mapa",
			"Ordenar por categoría",
			"Ordenar alfabéticamente"
		};

	public static void setMostrar_pois(boolean mostrar_pois) {
		VBusqueda.mostrar_pois = mostrar_pois;
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//requestWindowFeature(Window.FEATURE_NO_TITLE);
		
		DataView.enBusqueda = true;
//		ordenamiento = MarkerComparator.ORDENAMIENTO_ALFABETICO;
		ordenar_eventos = false;
		this.setContentView(R.layout.busqueda);
		
		getSherlock().getActionBar().setTitle("Búsqueda");
		
		//header
		
//		Button btnLogo = (Button) findViewById(R.id.btnLogo);
//		btnLogo.setOnClickListener(new View.OnClickListener() {
//			@Override
//			public void onClick(View v) {
//				finish();
//			}
//		});
		
		
//		Button btnHeaderAr = (Button) findViewById(R.id.btnHeaderAr);
//		btnHeaderAr.setOnClickListener(new View.OnClickListener() {
//			@Override
//			public void onClick(View v) {
//				Intent i = new Intent(VInicial.getContext(), VAR.class);
//				startActivity(i);
//			}
//		});
		
//		Button btnHeaderMapa = (Button) findViewById(R.id.btnHeaderMapa);
//		btnHeaderMapa.setOnClickListener(new View.OnClickListener() {
//			@Override
//			public void onClick(View v) {
//				Intent i = new Intent(VInicial.getContext(), VMapa.class);
//				startActivity(i);
//			}
//		});
		
		selectedItemIndex = new Vector<Integer>();
		
		//botones de busqueda
//		Button btnBuscar = (Button) findViewById(R.id.btnBuscar);
//		btnBuscar.setOnClickListener(new View.OnClickListener() {
//
//			@Override
//			public void onClick(View v) {
//				buscar();
//			}
//		});

//		Button btnFiltro = (Button) findViewById(R.id.btnFiltrar);
//		btnFiltro.setOnClickListener(new View.OnClickListener() {
//
//			@Override
//			public void onClick(View v) {
//				Intent i = new Intent("com.arpucp.VFILTRO");
//				startActivity(i);
//			}
//		});
		
//		EditText etxBuscar  = (EditText) findViewById(R.id.etxBuscar);
//		etxBuscar.setOnEditorActionListener(new TextView.OnEditorActionListener() {
//			
//	        @Override
//	        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
//	            if (actionId == EditorInfo.IME_ACTION_DONE) {
//	            	buscar();
//	                return true;
//	            }
//	            return false;
//	        }
//	    });
		
		textoBusqueda = null;
	}
	
	private void buscar() {
		ordenamiento = MarkerComparator.ORDENAMIENTO_RELEVANCIA;
		ordenar_eventos = false;
		
		if (textoBusqueda == null || textoBusqueda.equalsIgnoreCase(""))  {
			textoBusqueda = "";
			ordenamiento = MarkerComparator.ORDENAMIENTO_ALFABETICO;
		}
		
		Intent i = new Intent(VInicial.getContext(), VDownloading.class);
		i.putExtra("sigV", "busqueda");
		i.putExtra("textoBusqueda", textoBusqueda);
		startActivity(i);
	}

	@Override
	protected void onResume() {
		super.onResume();
		
		if (DataView.volverInicio)	{
			finish();
			return;
		}
		
        if (DataView.actualizarMarkers) {
        	DataView.actualizarMarkers = false;
        	//VInicial.dataView.applyCatFilter(VInicial.dataView.getDataHandler().getMarkerListTotal());
			Intent i = new Intent(VInicial.getContext(), VDownloading.class);
			i.putExtra("sigV", "busqueda");
			startActivity(i);
        	this.finish();
        	return;
        }
        
		if (mostrarResultado) { //texto que indica resultado, pueden haber 0 resultados y debe indicarse
			TextView TVTitle = (TextView) findViewById(R.id.txtResBusqueda);
			TVTitle.setVisibility(View.VISIBLE);
		}
		else	{
			TextView TVTitle = (TextView) findViewById(R.id.txtResBusqueda);
			TVTitle.setVisibility(View.GONE);			
		}
		if (mostrar_pois)	{
			markerList = VInicial.dataView.getDataHandler().getMarkerList();
			if ((markerList == null) || (markerList.isEmpty())) {
				// no hay resultado de busqueda
				TextView TVTitle = (TextView) findViewById(R.id.txtResBusqueda);
				TVTitle.setText("No se encontraron resultados");
				
				listB = (ListView) findViewById(R.id.listaBusqueda);
				listB.setAdapter(null);
			}
			else	{
				mostrarLista(ordenamiento);
			}
		}
		else	{
			mostrar_pois = true;
		}
	}
	
	@Override
	public void finish(){
		VInicial.getDataView().restaurarListaOriginal();
		hayBusqueda = false;
		super.finish();
	}
	
	private void mostrarLista(int ordenamiento) {

		if (ordenar_eventos)	{
			//si todos son eventos, no ordenar (se utiliza el ordanamiento con el que viene de json, por fechas))
			for (int i = 0; i < markerList.size(); i++) {
				Marker ma = markerList.get(i);
				if (ma.getDatasource() != DATASOURCE.EVENTOSURL) {
					Collections.sort(markerList, new MarkerComparator(ordenamiento));
					break;
				}
			}
		}
		else if (ordenamiento != MarkerComparator.ORDENAMIENTO_RELEVANCIA)	{
			Collections.sort(markerList, new MarkerComparator(ordenamiento));
		}
		
		int markerListSize = markerList.size();

		TextView TVTitle = (TextView) findViewById(R.id.txtResBusqueda);
		
		if (markerListSize == 1)
			TVTitle.setText("Se encontró 1 resultado:");
		else
			TVTitle.setText("Se encontraron " + markerListSize + " resultados:");
		
		listB = (ListView) findViewById(R.id.listaBusqueda);

		// agrego los pois a la lista
		ListaPOIRow[] listapoi_data = new ListaPOIRow[markerListSize];
		selectedItemIndex.clear();

		int data_idndex = 0;
		for (int i = 0; i < markerListSize; i++) {
			Marker ma = markerList.get(i);
			if (ma.isActive()) {
				listapoi_data[data_idndex++] = new ListaPOIRow(
						ma.getIcon(), ma.getTitle(), ma.getDistance());
				selectedItemIndex.add(i);
			}
		}

		ListaPOIAdapter adapter = new ListaPOIAdapter(this,
				R.layout.listapoi_row, listapoi_data);

		listB.setAdapter(adapter);

		listB.setVerticalFadingEdgeEnabled(true); // Make sure that fading is
													// displayed on samsung
													// devices

		listB.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> l, View v, int position,
					long id) {
				Integer POIIndex = position < selectedItemIndex.size() ? selectedItemIndex
						.get(position) : -1;
				if (POIIndex != -1) {
					Intent i = new Intent(VInicial.getContext(), VDownloading.class);
					i.putExtra("sigV", "poi");
					//VPOI.setPoi((ArpucpPOIMarker) markerList.get(POIIndex));
//					TabGeneral.setPoi((ArpucpPOIMarker) markerList.get(POIIndex));
//					TabUbicacion.setPoi((ArpucpPOIMarker) markerList.get(POIIndex));
//					TabServicios.setPoi((ArpucpPOIMarker) markerList.get(POIIndex));
					//MasterActivity.addPoi((ArpucpPOIMarker) markerList.get(POIIndex));
					MasterActivity._poi = (ARMarker)markerList.get(POIIndex);
					MasterActivity._markerListTemporal = markerList;
					MasterActivity._bpoi = null;
					MasterActivity._poiHijoAnterior = null;
					i.putExtra("idPOI",  "setted");
					startActivity(i);
				}
			}
		});

	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
//			try {
//				VInicial.dataView.getDataHandler().clearMarkers(); //limpiar al lista al salir de la busqueda
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
			VBusqueda.mostrarResultado = false;
			DataView.enBusqueda = false;
			return super.onKeyDown(keyCode, event);
		}
		return false;
	}
	
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.menu_busqueda, menu);
		
		 SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
		 
	        final SearchView searchView = (SearchView) menu.findItem(R.id.vBusquedaSearchView).getActionView();
	        if (null != searchView )
	        {
	            searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
	            searchView.setIconifiedByDefault(true);   
//	            searchView.requestFocus();
	        }

	        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() 
	        {
	            public boolean onQueryTextChange(String newText) 
	            {
	                // this is your adapter that will be filtered
//	                adapter.getFilter().filter(newText);
	                return true;
	            }

	            public boolean onQueryTextSubmit(String query) 
	            {
	                // this is your adapter that will be filtered
//	                adapter.getFilter().filter(query);
	            	System.out.println("QUERY <" + query + ">");
	            	textoBusqueda = query;
	            	searchView.clearFocus();
	            	buscar();
	                return true;
	            }
	        };
	        searchView.setOnQueryTextListener(queryTextListener);
		
        return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		
		Intent i;
		switch (item.getItemId()) {
		case R.id.menuCategoria:
			textoBusqueda = null;
			i = new Intent(VInicial.getContext(), VFiltro.class);
			startActivity(i);
			break;
		case R.id.menuCompartir: //Buscar por servicio
			i = new Intent(VInicial.getContext(), VServicios.class);
			startActivity(i);
			break;
		case R.id.menuVerEnRA:
			i = new Intent(VInicial.getContext(), VAR.class);
			startActivity(i);
			break;
		case R.id.menuVerEnMapa:
			i = new Intent(VInicial.getContext(), VMapa.class);
			startActivity(i);
			break;
		case R.id.menuOrdenarCategoria:
			if ((markerList != null) && (!markerList.isEmpty())) {
				ordenamiento = MarkerComparator.ORDENAMIENTO_CATEGORIA;
				ordenar_eventos = false;
				mostrarLista(ordenamiento);
			}
			break;
		case R.id.menuOrdenarAlfabeticamente:
			if ((markerList != null) && (!markerList.isEmpty())) {
				ordenamiento = MarkerComparator.ORDENAMIENTO_ALFABETICO;
				ordenar_eventos = false;
				mostrarLista(ordenamiento);
			}
			break;
		}
//		System.out.println("ITEM: <" + item + ">");
		return true;
	}
}
